
#ifndef __PAISLEYPARK__POINT_H__
#define __PAISLEYPARK__POINT_H__

#include <iostream>

template<int DIM>
class Point;

template <int DIM>
std::ostream& operator<<(std::ostream &, const Point<DIM> & _p);

template <int DIM>
Point<DIM> operator+(const Point<DIM> & _p1, const Point<DIM> & _p2);

template <int DIM>
Point<DIM> operator*(const double _k, const Point<DIM> &_p);

template<int DIM>
class Point {
private:
	double* __Coord;
	double __Time;
public:
	Point();
	Point(const double *_x);
	Point(const Point<DIM> &_p);
	~Point();
	void set_point(const double *_x);
	void set_time(const double _t);
	const double get_time() const;
	const double& operator[](int _n) const;
	const Point<DIM>& operator=(const Point<DIM> &_p);
	friend std::ostream& operator<< <>(std::ostream &, const Point<DIM> &);
	friend Point<DIM> operator+ <>(const Point<DIM> &, const Point<DIM> &);
	friend Point<DIM> operator* <>(const double _k, const Point<DIM> &);
};

#else
//Do nothing.
#endif
